/**
 * 
 */
package com.lanswon.qzsmk.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.ContextLoader;

import ch.qos.logback.classic.Logger;

import com.lanswon.common.card.CardUtil;
import com.lanswon.qzsmk.dao.CardDataMapper;
import com.lanswon.qzsmk.dao.CardProdunctDefinitionMapper;
import com.lanswon.qzsmk.exception.ApplicationException;
import com.lanswon.qzsmk.exception.ErrorCode;
import com.lanswon.qzsmk.model.CardData;
import com.lanswon.qzsmk.model.CardNoGenerated;
import com.lanswon.qzsmk.model.CardProdunctDefinition;

/**
 * 市民卡号生成器
 * 卡号组成：卡面号前缀+验证码+序列号
 * 卡面号前缀：卡发行标识(2位)  + 卡类型(1位) + 卡行业产品标识(1位)
 * 验证码：通过算法得出，1位
 * 序列号：7位
 * @author sun
 *
 */
public class CitizenCardNoGeneratorUtil {
	
	private static Logger logger = (Logger) LoggerFactory
			.getLogger(CitizenCardNoGeneratorUtil.class);

	/**
	 * 废弃
	 * @param prefix 卡面号前缀
	 *  
	 * @return 卡面号
	 */
	public static String generatorKey(String prefix,String cardpCode) {
		CardDataMapper cdm = SpringContextHolder.getBean(CardDataMapper.class);
		CardData cd = cdm.queryNewestObject(cardpCode);
		int valid = 0;
		if(cd==null){
			 valid = CardUtil.calcLuhn("0000001");
			return prefix+valid+"0000001";
		}
		 String endNo = cd.getCitizenCardNo().substring(5);//最新一条数据的市民卡号后7位
			logger.error("***************************上一条卡面号*****：[{}]",cd.getCitizenCardNo());

		 Integer newNo = Integer.parseInt(endNo)+1;//生成   后7位+1
		String gg="";
		 String s ="";
		 int l =  newNo.toString().length();
		 if(endNo.indexOf("0")==0 && l<7){
			int p = 7-l;//最后所需0的个数
			 for(int i=0;i<p;i++){
				 s += "0";
			 }
			 gg = s + newNo.toString();
		 }else if(l==7){
			 gg= newNo.toString();
		 }
		 
		  valid = CardUtil.calcLuhn(prefix+gg);
			String newCardNo =prefix+ valid+gg;//组合卡面号
			logger.error("*********************************卡面号*****：[{}]",newCardNo);
		return newCardNo;
	}
	/**
	 * 根据开始卡号段和数量生成卡号
	 * @param num
	 * @param startNumber
	 * @param prefix
	 * @return
	 * @throws Exception
	 */
	public static List<String> generatorCitizenCardNo(int num,String startNumber,String prefix) throws Exception{
		List<String> list=new ArrayList<>();
		String currentNo=startNumber;
		int valid = 0;
		String dd=currentNo;//后7位
		for(int j=0;j<num;j++){
			String endNo = "";
			if (StringUtils.isNotEmpty(dd)) {
				endNo=dd;
			} else {
				throw new ApplicationException(ErrorCode.OBJECT_IS_NULL, "CitizenCardNo is null !!!");
			}
			logger.error("***************************上一条卡面号后7位*****：[{}]", dd);
			Integer newNo = Integer.parseInt(endNo) ;
			String gg = "";
			String s = "";
			int l = newNo.toString().length();
			if (endNo.indexOf("0") == 0 && l < 7) {
				int p = 7 - l;// 最后所需0的个数
				for (int i = 0; i < p; i++) {
					s += "0";
				}
				gg = s + newNo.toString();
			} else if (l == 7) {
				gg = newNo.toString();
			}

			valid = CardUtil.calcLuhn(prefix + gg);
			String newCardNo = prefix + valid + gg;// 组合卡面号
			if (CardUtil.verifyCardNo(newCardNo)) {
				list.add( newCardNo);
				dd=CommonUtil.patchHexString(String.valueOf(newNo.intValue()+1), 7);// 生成 后7位+1
			}
			else {
				throw new ApplicationException(ErrorCode.DATA_ILLEGALITY, "卡面号不合法");
			}
		}
		return list;
	}
	
	
	/**
	 * 根据卡产品获取卡面号前缀
	 * @param cardPCode 卡产品代码
	 * @param cardType 卡物理外型代码
	 * @return
	 */
	public static String getCardNoPrefix(String cardPCode,String cardType){
		//卡发行商
		CardProdunctDefinitionMapper cpdm = ContextLoader.getCurrentWebApplicationContext().getBean(CardProdunctDefinitionMapper.class);
		//CardProdunctDefinitionMapper cpdm=SpringContextHolder.getBean(CardProdunctDefinitionMapper.class);
		CardProdunctDefinition cpd = cpdm.queryCardPCode(cardPCode);
		String cardPublisher = cpd.getCardPublisherCode();
		String prefix =cardPublisher+cardType+"0";  //卡行业产品标识 目前定死0
		return prefix;
	}
	
	
	public static void main(String[] args) throws Exception {
//		String s = generatorKey("1100");
//		CardUtil.verifyCardNo(s);
//		System.out.println(CardUtil.verifyCardNo(s));

		System.out.println(generatorSeq("5", 3));
		
//		int s = CardUtil.calcLuhn("2");
//		System.out.println(s);
		
	}
	
	
	/**
	 * 总长度length,a长度不够补0,例如a=2,length=4,返回0002
	 * @param a
	 * @param length
	 * @return
	 */
	public static String generatorSeq(String a,int length){
		StringBuffer d = new StringBuffer();
		if(a.length() < length){
			int num = length-a.length();//0的个数
			for(int i=0;i<num;i++){
				d.append(0);
			}
			
			d.append(a);
		}
		
		
		return d.toString();
	}
	
	
}
